#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include"args.h"
#include"data_struct.h"
#include<errno.h>

char  error_info [512];

//计算每月还款程序
int main(int argc, char ** argv){

    //帮助
    if(argc==2 && ( !strcmp(argv[1],"-h") || !strcmp(argv[1],"--help") ) ){
        printHelp();
        return 0;
    }
    args_t * args = malloc(sizeof(args_t));
    int ret = parseArgs(argc,argv,args);
    if(errno){
        sprintf(error_info,"%s文件%d行报错:errno错误码:%d",__FILE__,__LINE__,errno); 
        puts(error_info);
        printHelp();
        return 1;
    }
    //出现不能解析的参数终止程序
    if(ret){
        puts(error_info);
        printHelp();
        return 1;
    }
    //必要参数缺失时终止程序
    if(!(args->total_money&&args->total_months&&args->year_rate)){
        sprintf(error_info,"%s文件%d行报错:必要参数缺失",__FILE__,__LINE__);
        puts(error_info);
        printHelp();
        return 1;
    }
    // event_month和forward_money不同时出现就终止程序
    if(!args->event_month!=!args->forward_money){
        sprintf(error_info, "%s文件%d行报错:-e和-f没有同时出现",__FILE__,__LINE__);
        puts(error_info);
        printHelp();
        return 1;
    }
    
    // event_month和forward_money不存在时，传入了event_month2和forward_money2就终止程序
    if(!args->event_month && (args->event_month2 || args->forward_money2 )){
        sprintf(error_info,"%s文件%d行报错:用-E和-F参数,但是没有提供 -e 和 -f参数",__FILE__,__LINE__);
        puts(error_info);
        printHelp();
        return 1;
    }

    // event_month2和forward_money2不同时出现就终止程序
    if(!args->event_month2!=!args->forward_money2){
        sprintf(error_info, "%s文件%d行报错:-E和-F没有同时出现",__FILE__,__LINE__);
        puts(error_info);
        printHelp();
        return 1;
    }
    total_info_t * info = malloc(sizeof(struct total_pay_info)); 
    init_total_pay_info(info,args->total_money,args->total_months,args->year_rate);
    if(args->event_month&&args->forward_money){
        print_one_month(info,args->event_month);
        total_info_t * new_info = shift_pay(info,args->event_month,args->forward_money);
        double save1 = info->vec[args->event_month-1].interest_future_pay - new_info->total_interest;
        printf("-------在第%d个月提前还%f元之后共节省利息:%f元,月供由%.2f元降到了%.2f元---------\n",
                args->event_month,args->forward_money,
                save1,
                info->money_per_month,
                new_info->money_per_month 
              );

        if(args->event_month2&&args->forward_money2){
            print_one_month(new_info,args->event_month2-args->event_month);
            total_info_t * new_info2 = shift_pay(new_info,args->event_month2-args->event_month,args->forward_money2);
            double save2 = new_info->vec[args->event_month2-args->event_month-1].interest_future_pay - new_info2->total_interest;
            printf("-------第二次在第%d个月提前还%f元之后总共节省利息:%f元,月供由%.2f元降到了%.2f元再降到%.2f元---------\n",
                    args->event_month2,args->forward_money2,
                    save1+save2,
                    info->money_per_month,
                    new_info->money_per_month,
                    new_info2->money_per_month
                  );
            print_one_month(new_info2,1);
        }else{
            print_total_pay_info(new_info);
        }
    }else{
        print_total_pay_info(info);
    }
    
    return 0;
}
